﻿Imports BUS
Imports DTO
Imports DAO

Public Class ucHoaDon
    Public newHD As Boolean = True
    Public oldID As Integer
    Public tongTien As Decimal = 0
    Public oldSoLuong As Integer = 0
    Public war As String

    Private Sub UcNgay_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UcNgay.Load
        lbThongBao.Visible = False

        Dim tlBUS As New TheLoaiBUS
        Dim theloais As IQueryable(Of TheLoai)
        theloais = tlBUS.LayBang()

        TheLoai.DataSource = theloais

        TheLoai.ValueMember = "MaTL"
        TheLoai.DisplayMember = "TenTL"
    End Sub

    Private Sub btnGhi_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGhi.Click
        Try
            war = ""
            lbThongBao.Text = "Hóa đơn nhập lỗi: "
            If dgvHoaDon.Rows.Count <= 1 Then
                Exit Sub
            End If

            Dim thuong = "ạáàãảâậấầẩẫăặắằẳẵđẹéèẻẽêệếềểễíìỉĩịọòóỏõôộỗổồốơợớờởỡúùủũụưựứừửữ"
            Dim HOA = "ẠÁÀẢÃĂẶẰẮẲẴÂẤẦẨẪẬĐÉÈẼẺẸÊẾỀỂỄỆIÍÌỈĨỊỌÒÓỎÕÔỘỒỐỔỖƠỜỚỢỞỠÚÙỦŨỤƯỰỬỮỨỪ"

            Dim ucdate = New ucNgay

            Dim hdDTO As New HoaDonDTO
            Dim hdBUS As New HoaDonBUS
            Dim cthdDTO As New ChiTietHDDTO
            Dim cthdBUS As New ChiTietHDBUS
            Dim sBUS As New SachBUS
            Dim sDTO As New SachDTO

            'nếu là khách hàng có nợ
            If txtCMND.Text <> "" Then
                Dim regex = "^[0-9]+$"
                If Not Check(txtCMND.Text, regex) Then
                    lbThongBao.Text = "CMND không hợp lệ!"
                    lbThongBao.Visible = True
                    MessageBox.Show(lbThongBao.Text, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
                End If
                Dim khBUS As New KhachHangBUS
                Try
                    Dim kh = khBUS.TimTheoCMND(txtCMND.Text)
                    If kh IsNot Nothing Then
                        Dim tsBUS As New ThongSoBUS
                        Dim noMax = tsBUS.QD2_SoTienNoMax()
                        If kh.SoTienNo > noMax Then
                            lbThongBao.Text = "Không thể bán cho khách hàng đang nợ quá " & noMax
                            lbThongBao.Visible = True
                            MessageBox.Show(lbThongBao.Text, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
                            Exit Sub
                        End If
                    End If
                Catch ex As Exception
                End Try

            End If

            'insert vao table HoaDon
            If newHD Then
                hdDTO.TenKH = XoaKiTuTrangDu(txtTenKhachHang.Text)
                hdDTO.NgayLap = ucdate.Ngay
                hdBUS.Them(hdDTO)
                oldID = hdDTO.MaHD
            End If

            'Chi tiết hóa đơn
            Dim tonMin As Integer
            Dim i As Integer = 0
            Dim bool As Boolean = True
            'biến i dùng để chạy từ dòng 1 đến n - 1 dòng trong dgvHoaDon
            'dòng cuối của dgvPhieuHoaDon là rỗng
            Dim n As Integer = dgvHoaDon.Rows.Count - 2
            For Each dgvRow As DataGridViewRow In dgvHoaDon.Rows
                If i > n Then
                    Exit For
                End If
                lbThongBao.Visible = True
                i = i + 1
                If newHD Then
                    cthdDTO.MaHD = hdDTO.MaHD
                Else
                    cthdDTO.MaHD = oldID
                    hdDTO.MaHD = oldID
                End If
                newHD = False

                Dim regex = "^[0-9 ]*([A-Z" & HOA & "]{1}[a-z" & thuong & "]+[ ]{1})+[0-9 ]*[A-Z" & HOA & "]{1}[a-z" & thuong & "]+[0-9 ]*$"
                If Not Check(dgvRow.Cells("Sach").Value.ToString(), regex) Then
                    lbThongBao.Text &= i.ToString() + ", "
                    bool = False
                    Continue For
                End If

                regex = "^([A-Z" & HOA & "]{1}[a-z" & thuong & "]+[ ]{1})+[A-Z" & HOA & "]{1}[a-z" & thuong & "]+$"
                If Not Check(dgvRow.Cells("TenTG").Value.ToString(), regex) Then
                    lbThongBao.Text &= i.ToString() + ", "
                    bool = False
                    Continue For
                End If

                regex = "^[0-9]+$"
                If Not Check(dgvRow.Cells("SoLuong").Value.ToString(), regex) Then
                    lbThongBao.Text &= i.ToString() + ", "
                    bool = False
                    Continue For
                End If

                regex = "^[0-9]+.{0,1}[0-9]+$"
                If Not Check(dgvRow.Cells("DonGiaBan").Value.ToString(), regex) Then
                    lbThongBao.Text &= i.ToString() + ", "
                    bool = False
                    Continue For
                End If

                'thong tin cho cthdDTO
                cthdDTO.TenSach = XoaKiTuTrangDu(dgvRow.Cells(0).Value.ToString())
                cthdDTO.MaTL = dgvRow.Cells(1).Value
                cthdDTO.TenTG = dgvRow.Cells(2).Value.ToString()
                Integer.TryParse(dgvRow.Cells(3).Value, cthdDTO.SoLuong)
                Integer.TryParse(dgvRow.Cells(4).Value, cthdDTO.DonGiaBan)
                cthdDTO.ThanhTien = cthdDTO.DonGiaBan * cthdDTO.SoLuong

                'Thong tin cho sDTO
                sDTO.TenSach = cthdDTO.TenSach
                sDTO.MaTL = cthdDTO.MaTL
                sDTO.TenTG = cthdDTO.TenTG
                sDTO.SoLuong = cthdDTO.SoLuong

                Dim cthds = cthdBUS.TimKiem(cthdDTO)
                Dim book As New Sach
                Dim tt As Boolean = True
                Try
                    book = sBUS.TimKiem_GiamSoLuong(sDTO)
                Catch ex As Exception
                    tt = False
                End Try


                If Not tt Then
                    lbThongBao.Text &= i.ToString() + ", "
                    bool = False
                    Continue For
                Else
                    Dim tsBUS As New ThongSoBUS
                    tonMin = tsBUS.QD2_SoLuongTonSauBanMin()
                    If sDTO.SoLuong < tonMin Then
                        war &= "Sách '" + sDTO.TenSach + "'" & vbNewLine
                        Continue For
                    End If

                    'kiem tra hoa don co the thay doi 1 so thong tin, hay la them moi
                    If cthds.Count = 0 Then 'them moi cthd
                        cthdBUS.Them(cthdDTO)
                    Else 'Cap nhat neu co su thay doi cac thong so
                        cthdBUS.CapNhat(cthdDTO)
                    End If

                    'cap nhat lai so luong cua sach sau khi ban
                    sDTO.SoLuong = sDTO.SoLuong + oldSoLuong 'cong lai so luong da tru o truoc
                    sBUS.CapNhat(sDTO)

                    tongTien = tongTien + cthdDTO.DonGiaBan * cthdDTO.SoLuong
                End If

            Next
            'cập nhật tổng tiền trong hóa đơn
            hdDTO.TongTien = tongTien
            hdBUS.CapNhat(hdDTO)

            'thể hiện tổng tiền trên form
            txtTongTien.Text = tongTien
            If bool Then
                lbThongBao.Text = "Nhập Hóa Đơn thành công."
            End If

            If war <> "" Then
                war &= "Sau khi bán thì số lượng tồn nhỏ hơn quy định tồn Min(" + tonMin.ToString() + ").Nên không được bán."
                MessageBox.Show(war, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        End Try
    End Sub

    Private Sub btnNhapHDMoi_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNhapHDMoi.Click
        newHD = True
        dgvHoaDon.Rows.Clear()
        txtTenKhachHang.Clear()
        txtTongTien.Clear()
        lbThongBao.Visible = False
    End Sub

    Private Sub dgvHoaDon_CellBeginEdit(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles dgvHoaDon.CellBeginEdit
        If e.ColumnIndex = 3 Then 'nếu đúng là thay đổi ở cột số lượng
            If dgvHoaDon.Rows(e.RowIndex).Cells(e.ColumnIndex).Value Is Nothing Then
                Return
            End If

            Integer.TryParse(dgvHoaDon.Rows(e.RowIndex).Cells(3).Value.ToString(), oldSoLuong)
        End If
    End Sub
End Class
